package org.Niu.July8th.collectionTest.listTest;

/**
 *
 * 因此，我们总结一下equals()方法的正确编写方法：
 *
 * 先确定实例“相等”的逻辑，即哪些字段相等，就认为实例相等；
 * 用instanceof判断传入的待比较的Object是不是当前类型，如果是，继续比较，否则，返回false；
 * 对引用类型用Objects.equals()比较，对基本类型直接用==比较。
 * 使用Objects.equals()比较两个引用类型是否相等的目的是省去了判断null的麻烦。两个引用类型都是null时它们也是相等的。
 *
 * 如果不调用List的contains()、indexOf()这些方法，那么放入的元素就不需要实现equals()方法。
 */

import java.util.List;
import java.util.Objects;

public class Exercise3 {
    public static void main(String[] args) {
        List<Person_> list = List.of(
                new Person_("Xiao", "Ming", 18),
                new Person_("Xiao", "Hong", 25),
                new Person_("Bob", "Smith", 20)
        );
        boolean exist = list.contains(new Person_("Bob", "Smith", 20));
        System.out.println(exist ? "测试成功!" : "测试失败!");
    }
}

class Person_ {
    String firstName;
    String lastName;
    int age;
    public Person_(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Person_ p){
            // 引用数据类型这么写，基础数据类型直接 == 比较就可以
            return Objects.equals(this.firstName,p.firstName) && Objects.equals(this.lastName,p.lastName) && this.age == p.age;
        }
        return false;
    }
}
